/**
 * 
 */
package gui;

import java.util.ArrayList;

import javax.swing.table.DefaultTableModel;

import backend.AktiverZauber;

import main.Controller;

/**
 * @author Christian
 * 
 */
public class ZauberTableModel extends DefaultTableModel {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	/**
	 * 
	 */
	private ArrayList<AktiverZauber> gefilterteListe = new ArrayList<AktiverZauber>();
	
	/**
	 * 
	 */
	private HauptFenster hauptFenster;
	
	/**
	 * @param hauptFenster
	 *            Hauptfenster
	 */
	public ZauberTableModel(HauptFenster hauptFenster) {

		this.hauptFenster = hauptFenster;
		this.filtern();
	}
	
	/**
	 * @param col
	 *            gibt die Klasse der Spalte zurück
	 * @return Class
	 */
	@SuppressWarnings("unchecked")
	public Class getColumnClass(int col) {

		switch (col) {
		case 0:
			return String.class;
		case 1:
			return AktiverZauber.class;
		case 2:
			return String.class;
		default:
			return null;
		}
	}
	
	/**
	 * @return Anzahl der Zeilen
	 */
	public int getRowCount() {

		if (gefilterteListe == null) {
			return 0;
		}
		return gefilterteListe.size();
	}
	
	/**
	 * @return Anzahl der Spalten
	 */
	public int getColumnCount() {

		return 3;
	}
	
	/**
	 * @param column SpaltenId
	 * @return Name der Spalte
	 */
	public String getColumnName(int column) {

		switch (column) {
		case 0:
			return "Heldenname";
		case 1:
			return "Zaubername";
		case 2:
			return "Repräsentation";
		default:
			throw new IllegalArgumentException("Zu viele Spalten");
		}
	}
	
	/**
	 * Neu filtern und die Tabelle neu zeichnen
	 */
	public void aktualisiere() {

		filtern();
		fireTableDataChanged();
		if (hauptFenster.getJZauberTable().getRowCount() > 0) {
			hauptFenster.getJZauberTable().getSelectionModel().setSelectionInterval(0, 0);
		}
	}
	
	/**
	 * Filtert die HeldenListe
	 */
	public void filtern() {

		// TODO add Filter
		gefilterteListe.clear();
		for (AktiverZauber aVariante : Controller.getDatenController()
				.getAlleAktuellenVarianten()) {
			gefilterteListe.add(aVariante);
		}
		String heldenName = (String) hauptFenster.getJHeldenList().getSelectedValue();
		if (!heldenName.equals("Alle")) {
			for (int i = 0; i < gefilterteListe.size(); i++) {
				if (!heldenName.equals(Controller.getDatenController().getHeldenNameById(
						gefilterteListe.get(i).getHeldenId()))) {
					gefilterteListe.remove(i);
					i--;
				}
			}
		}
		String zauberName = (String) hauptFenster.getJZauberFilterComboBox().getSelectedItem();
		if (!zauberName.equals("Alle vorhanden")) {
			for (int i = 0; i < gefilterteListe.size(); i++) {
				if (!zauberName.equals(gefilterteListe.get(i).getZauber().getZauberName())) {
					gefilterteListe.remove(i);
					i--;
				}
			}
		}
	}
	
	/**
	 * @param rowIndex Reihe
	 * @param columnIndex SpaltenIndex
	 * @return Wert im Feld
	 */
	public Object getValueAt(int rowIndex, int columnIndex) {

		AktiverZauber aktuellerZauber;
		synchronized (gefilterteListe) {
			aktuellerZauber = gefilterteListe.get(rowIndex);
		}
		if (aktuellerZauber != null) {
			switch (columnIndex) {
			case 0:
				return Controller.getDatenController().getHeldenNameById(
						aktuellerZauber.getHeldenId());
			case 1:
				return aktuellerZauber;
			case 2:
				return aktuellerZauber.getZauber().getRepraesentation();
			default:
				throw new IllegalArgumentException("Zu viele Zeilen");
			}
		}
		return null;
	}
	
	/**
	 * @param rowIndex
	 *            Zeile
	 * @param columnIndex
	 *            Spalte
	 * @return true wenn das Feld veränderbar ist.
	 */
	public boolean isCellEditable(int rowIndex, int columnIndex) {

		return false;
	}
}
